﻿using System;
using System.Collections.Generic;
using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal;
using WorkOrder.Extensions;
using WorkOrder.Models;

namespace WorkOrder.Contexts;

public partial class WorkOrderContext : DbContext
{
    public WorkOrderContext()
    {
    }

    public WorkOrderContext(DbContextOptions<WorkOrderContext> options)
        : base(options)
    {
    }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){}

    public virtual DbSet<工单主表> 工单主表s { get; set; }
    public  virtual DbSet<工单模板表> 工单模板s { get; set; }
    public virtual DbSet<模板字段表> 工单模板详情s { get; set; }

    public virtual DbSet<资金流水表> 资金流水表s { get; set; }

    public virtual DbSet<流程配置表> 流程配置表s { get; set; }
    public virtual DbSet<流程节点表> 流程节点表s { get; set; }

    public virtual DbSet<节点路由表>  节点路由表s { get; set; }
    public virtual DbSet<工单流程实例表> 工单流程实例表s { get; set; }

    public virtual DbSet<工单全信息视图> 工单全信息视图s { get; set; }

 
    public virtual DbSet<用户账户余额表> 用户账户余额表s { get; set; }

 

    public virtual DbSet<工单分派记录表> 工单分派记录表s { get; set; }

    public virtual DbSet<工单操作日志表> 工单操作日志表s { get; set; }

    public virtual DbSet<工单类型表> 工单类型表s { get; set; }

    public virtual DbSet<工单评论表> 工单评论表s { get; set; }

    public virtual DbSet<工单附件表> 工单附件表s { get; set; }

    public virtual DbSet<当前分派视图> 当前分派视图s { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .UseCollation("utf8mb4_0900_ai_ci")
            .HasCharSet("utf8mb4");
        modelBuilder.Entity<资金流水表>(entity =>
        {
      
            entity.Property(e => e.流水类型)
            .HasConversion<string>() // 存储为字符串
            .HasMaxLength(20); // 按最长值的字符长度设置（如“充值”为2字符）
               entity.Property(e => e.交易状态)
            .HasConversion<string>() // 存储为字符串
            .HasMaxLength(20); // 按最长值的字符长度设置（如“充值”为2字符）
        });
     modelBuilder.Entity<工单流程实例表>(entity =>
{
    entity.Property(e => e.状态)
        .HasConversion<string>()
        .HasMaxLength(20);
    
});
     modelBuilder.Entity<流程节点表>(entity =>
{
    entity.Property(e => e.操作类型)
        .HasConversion<string>()
        .HasMaxLength(20);

         entity.Property(e => e.负责人规则类型)
        .HasConversion<string>()
        .HasMaxLength(20);
                 entity.Property(e => e.节点类型)
        .HasConversion<string>()
        .HasMaxLength(20);
            entity.Property(e => e.工单状态)
        .HasConversion<string>()
        .HasMaxLength(20);
    entity.HasOne(e => e.流程)
        .WithMany(p => p.节点列表)
        .HasForeignKey(e => e.流程ID)
        .OnDelete(DeleteBehavior.Cascade);
});
        modelBuilder.Entity<工单主表>(entity =>
        {
            entity.HasKey(e => e.工单id).HasName("PRIMARY");

            entity.ToTable("工单主表", tb => tb.HasComment("工单主表"));

            entity.Property(e => e.工单id).HasComment("工单ID");
        
            entity.Property(e => e.优先级)
            .HasConversion<string>() // 存储为字符串
            .HasMaxLength(10); // 按最长值的字符长度设置（如“紧急”为2字符）
            entity.Property(e => e.关闭时间).HasComment("关闭时间");
            entity.Property(e => e.创建人id).HasComment("创建人");
            entity.Property(e => e.创建时间)
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("创建时间");
            entity.Property(e => e.工单标题).HasComment("工单标题");
            entity.Property(e => e.工单编号).HasComment("工单编号");
      
 
            entity.Property(e => e.当前状态)
                .HasConversion<string>() // 存储为字符串
                .HasMaxLength(20);
            entity.Property(e => e.截止时间).HasComment("截止时间");
            entity.Property(e => e.更新时间)
                .ValueGeneratedOnAddOrUpdate()
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("更新时间");
            entity.Property(e => e.根工单id).HasComment("根工单ID");
            entity.Property(e => e.父工单id).HasComment("父工单ID");
            entity.Property(e => e.类型id).HasComment("工单类型");
  
            entity.Property(e => e.问题描述).HasComment("问题描述");

            entity.HasOne(d => d.根工单).WithMany(p => p.Inverse根工单)
                .OnDelete(DeleteBehavior.SetNull)
                .HasConstraintName("fk_根工单");

            entity.HasOne(d => d.父工单).WithMany(p => p.Inverse父工单)
                .OnDelete(DeleteBehavior.SetNull)
                .HasConstraintName("fk_父工单");

            entity.HasOne(d => d.类型).WithMany(p => p.工单主表s)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("fk_工单_类型");
             entity.Property(e => e.扩展字段)
            .HasConversion(
                v => JsonSerializer.Serialize(v, new JsonSerializerOptions(JsonConfig.JsonOptions)),
                v => JsonSerializer.Deserialize<Dictionary<string, object>>(
                    v, new JsonSerializerOptions(JsonConfig.JsonOptions)) ?? new())
            .HasColumnType("json"); // MySQL 5.7+支持json类型

        // 配置模板关系
            entity.HasOne(e => e.关联模板)
            .WithMany(t => t.关联工单)
           
            .HasForeignKey(w => w.模板ID)
            .HasPrincipalKey(t => t.模板ID);
        });
       modelBuilder.Entity<工单全信息视图>(entity =>
    {  
             entity.Property(e => e.当前状态)
                .HasConversion<string>() // 存储为字符串
                .HasMaxLength(20);

                   entity.Property(e => e.优先级)
                .HasConversion<string>() // 存储为字符串
                .HasMaxLength(20);
        entity.Property(e => e.扩展字段)
            .HasConversion(
                v => JsonSerializer.Serialize(v, new JsonSerializerOptions(JsonConfig.JsonOptions)),
                v => JsonSerializer.Deserialize<Dictionary<string, object>>(
                    v, new JsonSerializerOptions(JsonConfig.JsonOptions)) ?? new()
            )
            .HasColumnType("json"); // 如果数据库支持 JSON 类型（如 MySQL），可以指定类型
    });
        modelBuilder.Entity<工单全信息视图>(entity =>
        {
            entity.ToView("工单全信息视图");
        });

        modelBuilder.Entity<工单分派记录表>(entity =>
        {
            entity.HasKey(e => e.分派id).HasName("PRIMARY");

            entity.ToTable("工单分派记录表", tb => tb.HasComment("工单分派记录表"));

            entity.Property(e => e.分派id).HasComment("分派ID");
            entity.Property(e => e.分派类型)
            .HasConversion<string>() // 存储为字符串
            .HasMaxLength(20); // 按最长值的字符长度设置（如“sec
            entity.Property(e => e.分派说明).HasComment("分派说明");
            entity.Property(e => e.工单id).HasComment("工单ID");
            entity.Property(e => e.开始时间)
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("开始时间");
            entity.Property(e => e.是否当前负责人)
                .HasDefaultValueSql("'1'")
                .HasComment("是否当前负责人");
            entity.Property(e => e.用户id).HasComment("负责人");
            entity.Property(e => e.结束时间).HasComment("结束时间");
            entity.Property(e => e.分派批次id).HasComment("分派批次id");
            entity.HasOne(d => d.工单).WithMany(p => p.工单分派记录表s).HasConstraintName("fk_分派_工单");
        });

        modelBuilder.Entity<工单操作日志表>(entity =>
        {
            entity.HasKey(e => e.操作id).HasName("PRIMARY");

            entity.ToTable("工单操作日志表", tb => tb.HasComment("工单操作日志表"));

            entity.Property(e => e.操作id).HasComment("操作ID");
            entity.Property(e => e.工单id).HasComment("工单ID");
            entity.Property(e => e.操作人id).HasComment("操作人");
            entity.Property(e => e.操作时间)
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("操作时间");
            entity.Property(e => e.操作类型)
            .HasConversion<string>() // 存储为字符串
            .HasMaxLength(20); // 按最长值的字符长度设置（如“添加附件”为4字符）
            entity.Property(e => e.操作详情).HasComment("操作详情");

            entity.HasOne(d => d.工单).WithMany(p => p.工单操作日志表s).HasConstraintName("fk_操作_工单");
        });

        modelBuilder.Entity<工单类型表>(entity =>
        {
            entity.HasKey(e => e.类型id).HasName("PRIMARY");

            entity.ToTable("工单类型表", tb => tb.HasComment("工单类型表"));

            entity.Property(e => e.类型id).HasComment("类型ID");
            entity.Property(e => e.创建时间)
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("创建时间");
            entity.Property(e => e.响应sla).HasComment("响应SLA(分钟)");
            entity.Property(e => e.类型代码).HasComment("类型代码");
            entity.Property(e => e.类型名称).HasComment("类型名称");
            entity.Property(e => e.解决sla).HasComment("解决SLA(小时)");
        });

        modelBuilder.Entity<工单评论表>(entity =>
        {
            entity.HasKey(e => e.评论id).HasName("PRIMARY");

            entity.ToTable("工单评论表", tb => tb.HasComment("工单评论表"));
            entity.Property(e => e.评论类型)
                .HasConversion<string>()
                .HasMaxLength(20);
            entity.Property(e => e.评论id).HasComment("评论ID");
            entity.Property(e => e.创建时间)
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("创建时间");
            entity.Property(e => e.工单id).HasComment("工单ID");
            entity.Property(e => e.是否内部可见).HasComment("是否内部可见");
            entity.Property(e => e.更新时间)
                .ValueGeneratedOnAddOrUpdate()
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("更新时间");
            entity.Property(e => e.用户id).HasComment("评论人");
            entity.Property(e => e.评论内容).HasComment("评论内容");

            entity.HasOne(d => d.工单).WithMany(p => p.工单评论表s).HasConstraintName("fk_评论_工单");
        });

        modelBuilder.Entity<工单附件表>(entity =>
        {
            entity.HasKey(e => e.附件id).HasName("PRIMARY");

            entity.ToTable("工单附件表", tb => tb.HasComment("工单附件表"));

            entity.Property(e => e.附件id).HasComment("附件ID");
            entity.Property(e => e.上传时间)
                .HasDefaultValueSql("CURRENT_TIMESTAMP")
                .HasComment("上传时间");
            entity.Property(e => e.存储路径).HasComment("存储路径");
            entity.Property(e => e.工单id).HasComment("工单ID");
            entity.Property(e => e.文件名).HasComment("文件名");
            entity.Property(e => e.文件大小).HasComment("文件大小(字节)");
            entity.Property(e => e.文件类型).HasComment("文件类型");
            entity.Property(e => e.用户id).HasComment("上传人");

            entity.HasOne(d => d.工单).WithMany(p => p.工单附件表s).HasConstraintName("fk_附件_工单");
        });

        modelBuilder.Entity<当前分派视图>(entity =>
        {
            entity.ToView("当前分派视图");
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
